package jdk.utils;

import org.junit.Test;

import java.util.*;

/**
 *  java.util.Collections工具类的学习
 *  Collections 是集合框架的工具类
 *    Collections.synchronizedList
 *    Collections.synchronizedSet
 *
 */
public class Collections_Study {

    private static final int REVERSE_THRESHOLD        =   18;

    /**
     *  Collections的翻转方法
     * @param list  需要翻转的对象
     */
    public static void reverse(List<?> list) {
        int size = list.size();
        if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
            //mid是size的一半  >>右移1位 变成原来一半  for(int i=0,mid=index/2,j=index-1;i<mid;i++,j-- )
            for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
                swap(list, i, j);
        } else {
            // 向前向后迭代器  fwd 指向第一个元素，rev 指向最后一个元素
            ListIterator fwd = list.listIterator();
            ListIterator rev = list.listIterator(size);
            for (int i=0, mid=list.size()>>1; i<mid; i++) {
                Object tmp = fwd.next();
                fwd.set(rev.previous());
                rev.set(tmp);
            }
        }
    }

    /**
     *
     * @param list   传入list的集合
     * @param i      list的第 i个元素
     * @param j      list的第 j个元素
     */
    public static void swap(List<?> list, int i, int j) {
        final List temp = list;
        temp.set(i, temp.set(j, temp.get(i)));
    }

    /**
     *  Collections.sort(List<T> list, Comparator<? super T> c) 方法进行排序，第一个参数传入的集合必须是实现Comparable接口的compareTo（）方法的集合
     *  内部排序是使用了   Arrays.sort(a, (Comparator) c); 数组的排序方案。
     *  第二个参数是实现了Comparator的比较器，Collections实现了两种以自然排序升序和降序的Comparator接口：
     *
     *                  Collections.reverseOrder()  Java中比较器接口的reverseOrder()方法返回一个比较器，该比较器用于以自然顺序相反的方式比较可比较对象。
     *                  Collections.natureOrder()   Java中比较器接口的natureOrder()方法返回一个比较器，该比较器用于以自然顺序的方式比较可比较对象。
     */
    @Test
    public void test1(){
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(-1);
        arrayList.add(3);
        arrayList.add(3);
        arrayList.add(-5);
        arrayList.add(7);
        arrayList.add(4);
        arrayList.add(-9);
        arrayList.add(-7);
        System.out.println("原始数组:");
        System.out.println(arrayList);

        Collections.sort(arrayList);
        System.out.println("Collections.sort(arrayList):");
        System.out.println(arrayList);
        // 定制排序的⽤法，必须实现Comparator接口，这里使用的是Comparator自己实现的以自然排序相反的排序，内部是ReverseComparator类
        Collections.sort(arrayList, Comparator.reverseOrder());
        System.out.println("定制排序后：");
        System.out.println(arrayList);
    }
}
